/*
 * $Id: sio.h,v 1.29 2005-12-26 05:38:24 bacon Exp $
 */
 
#ifndef _XP_BAS_SIO_H_
#define _XP_BAS_SIO_H_

#include <xp/types.h>
#include <xp/macros.h>
#include <xp/bas/fio.h>
#include <xp/bas/tio.h>
#include <xp/bas/str.h>
#include <xp/bas/stdarg.h>

typedef xp_off_t xp_siopos_t;
typedef struct xp_sio_t xp_sio_t;

struct xp_sio_t
{
	xp_bool_t  __dynamic;
	int        __status;

	xp_fio_t   fio;
	xp_tio_t   tio;
};

#ifdef __cplusplus
extern "C" {
#endif

extern xp_sio_t* xp_sio_in;
extern xp_sio_t* xp_sio_out;
extern xp_sio_t* xp_sio_err;

xp_sio_t* xp_sio_open (xp_sio_t* sio,
	const xp_char_t* file, const xp_char_t* mode);
xp_sio_t* xp_sio_openhnd (xp_sio_t* sio, xp_fiohnd_t handle);
int xp_sio_close (xp_sio_t* sio);

xp_fiohnd_t xp_sio_gethnd (xp_sio_t* sio);

xp_ssize_t xp_sio_flush (xp_sio_t* sio);
void xp_sio_purge (xp_sio_t* sio);

xp_ssize_t xp_sio_getc (xp_sio_t* sio, xp_char_t* c);
xp_ssize_t xp_sio_gets (xp_sio_t* sio, xp_char_t* buf, xp_size_t size);
xp_ssize_t xp_sio_getsx (xp_sio_t* sio, xp_char_t* buf, xp_size_t size);
xp_ssize_t xp_sio_getstr (xp_sio_t* sio, xp_str_t* buf);

xp_ssize_t xp_sio_putc (xp_sio_t* sio, xp_char_t c);
xp_ssize_t xp_sio_puts (xp_sio_t* sio, const xp_char_t* str);
xp_ssize_t xp_sio_putsx (xp_sio_t* sio, const xp_char_t* str, xp_size_t size);
xp_ssize_t xp_sio_putsn (xp_sio_t* sio, ...);
xp_ssize_t xp_sio_putsxn (xp_sio_t* sio, ...);
xp_ssize_t xp_sio_putsv (xp_sio_t* sio, xp_va_list ap);
xp_ssize_t xp_sio_putsxv (xp_sio_t* sio, xp_va_list ap);

/* WARNING:
 *   getpos may not return the desired postion because of the buffering 
 */
int xp_sio_getpos (xp_sio_t* sio, xp_siopos_t* pos);
int xp_sio_setpos (xp_sio_t* sio, xp_siopos_t pos);
int xp_sio_rewind (xp_sio_t* sio);
int xp_sio_movetoend (xp_sio_t* sio);


#ifdef __cplusplus
}
#endif

#endif
